// package com.ww.sound_emission.mq;
//
// import com.fasterxml.jackson.databind.ObjectMapper;
// import com.fasterxml.jackson.databind.node.ObjectNode;
// import com.ww.sound_emission.domain.MacData;
// import com.ww.sound_emission.domain.mqtt.MqttData;
// import com.ww.sound_emission.mapper.MacDataMapper;
// import org.springframework.beans.factory.annotation.Autowired;
// import org.springframework.data.redis.core.StringRedisTemplate;
// import org.springframework.integration.annotation.ServiceActivator;
// import org.springframework.messaging.Message;
// import org.springframework.messaging.simp.SimpMessagingTemplate;
// import org.springframework.scheduling.annotation.Async;
// import org.springframework.stereotype.Service;
//
// import java.util.Date;
//
// @Service
// public class MqttMessageListener1 {
//
//     @Autowired
//     private StringRedisTemplate redisTemplate;  // Redis 操作模板
//
//     @Autowired
//     private ObjectMapper objectMapper;  // 用于 JSON 转换
//
//     @Autowired
//     private MacDataMapper macDataMapper;  // MyBatis-Plus Mapper
//
//     @Autowired
//     private SimpMessagingTemplate messagingTemplate;
//
//
//     // 用于发送消息的方法
//     public void sendMessage(String message) {
//         messagingTemplate.convertAndSend("/topic/messages", new com.ww.sound_emission.domain.Message(message));
//     }
//
//
//     @ServiceActivator(inputChannel = "mqttInputChannel")
//     public void handleMqttMessage(Message<?> message) {
//         // 获取 MQTT 消息头中的主题
//         String topic = message.getHeaders().get("mqtt_receivedTopic", String.class);
//         System.out.println("mqtt_receivedTopic"+topic);
//         // 获取 MQTT 消息体
//         String payload = (String) message.getPayload();
//         System.out.println("mqttInputChannel:"+payload);
//         try {
//             // 将 MQTT 消息体转换为 MqttData 对象
//             MqttData mqttData = objectMapper.readValue(payload, MqttData.class);
//
//             System.out.println("mqttData:"+mqttData);
//
//
//
//             // 从主题中提取机台编号（假设机台编号位于主题的最后一部分）
//             String machineCode = extractMachineCodeFromTopic(topic);
//
//             // 调用处理方法
//             processMqttData(mqttData, payload,machineCode);
//
//
//
//
//             try {
//
//                 // 处理数据
//                 processMqttData(mqttData, payload, machineCode);
//
//                 // 添加这段代码，通过WebSocket发送数据
//                 try {
//                     // 构建一个包含机台编号的新JSON对象
//                     ObjectNode jsonNode = objectMapper.createObjectNode();
//                     jsonNode.put("machineCode", machineCode);
//                     jsonNode.setAll((ObjectNode) objectMapper.readTree(payload));
//
//                     // 发送到WebSocket
//                     messagingTemplate.convertAndSend("/topic/machineData/" + machineCode,
//                             objectMapper.writeValueAsString(jsonNode));
//
//                     sendMessage(String.valueOf(jsonNode));
//
//                     // System.out.println(objectMapper.writeValueAsString(jsonNode));
//
//                     // System.out.println("WebSocket消息发送成功: " + machineCode);
//                 } catch (Exception e) {
//                     System.err.println("WebSocket发送失败: " + e.getMessage());
//                 }
//
//             } catch (Exception e) {
//                 e.printStackTrace();
//             }
//
//
//
//
//
//
//
//
//
//
//
//
//
//         } catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
//
//     // 从 MQTT 主题中提取机台编号
//     private String extractMachineCodeFromTopic(String topic) {
//         // 假设机台编号是主题的最后一部分
//         String[] topicParts = topic.split("/");
//         return topicParts[topicParts.length - 1];  // 获取主题最后一部分作为机台编号
//     }
//
//     // 处理 MQTT 数据的核心方法
//     // 异步处理 MQTT 数据的方法
//     @Async("taskExecutor")
//     public void processMqttData(MqttData mqttData, String payload, String machineCode) {
//         try {
//             // 创建 MacData 实体对象
//             MacData macData = new MacData();
//             macData.setT(mqttData.getCnc().getT());
//             macData.setMainProg(mqttData.getCnc().getMainProg());
//             macData.setSubProg(mqttData.getCnc().getSubProg());
//             macData.setX(mqttData.getCnc().getX());
//             macData.setY(mqttData.getCnc().getY());
//             macData.setZ(mqttData.getCnc().getZ());
//             macData.setDurtime(mqttData.getDurtime());
//             boolean currentBreakStatus = mqttData.getSensor().getBreakStatus();
//             macData.setBreakStatus(mqttData.getSensor().getBreakStatus() ? 1 : 0);
//             macData.setIo(mqttData.getSensor().getIo() ? 1 : 0);
//             macData.setIsShowSpl(mqttData.getSensor().getShowSpl() ? 1 : 0);
//             macData.setS(mqttData.getSensor().getS());
//             macData.setS1(mqttData.getSensor().getS1());
//             macData.setS2(mqttData.getSensor().getS2());
//             macData.setS3(mqttData.getSensor().getS3());
//             macData.setSpl(mqttData.getSensor().getSpl());
//             macData.setStatus(mqttData.getCnc().getStatus());
//
//             // 将时间戳转换为 Date 对象
//             Date createTime = new Date(mqttData.getTime());
//             macData.setCreateTime(createTime);
//
//             // 生成 productSequence
//             String productSequence = mqttData.getCnc().getMainProg() + "-" + createTime.getTime();
//             macData.setProductSequence(productSequence);
//             // 机台编号
//             macData.setMachineCode(machineCode);
//
//             // 检查 BreakStatus 是否从 1 变为 2，如果是则记录当前 productSequence
//             String previousBreakStatusKey = "breakStatus:" + machineCode;  // 使用机台编号作为标识
//             // 获取 Redis 中的 BreakStatus 状态值，默认为 0
//             Integer previousBreakStatus = null;
//             String breakStatusFromRedis = (String) redisTemplate.opsForValue().get(previousBreakStatusKey);
//
//             // 如果 Redis 中的值为 null，则初始化 previousBreakStatus 为 0
//             if (breakStatusFromRedis != null) {
//                 try {
//                     previousBreakStatus = Integer.valueOf(breakStatusFromRedis);
//                 } catch (NumberFormatException e) {
//                     // 如果无法转换为整数，初始化为 0
//                     previousBreakStatus = 0;
//                 }
//             } else {
//                 // 如果 Redis 中没有值，初始化为 0
//                 previousBreakStatus = 0;
//             }
//
//             if (previousBreakStatus != null && previousBreakStatus == 1 && !currentBreakStatus) {
//                 // 如果状态变化了，从 1 变为 2，记录当前 productSequence
//                 logBreakStatusChange(productSequence);
//             }
//
//             // 更新当前 breakStatus 状态到 Redis
//             redisTemplate.opsForValue().set(previousBreakStatusKey, String.valueOf(currentBreakStatus ? 1 : 2));
//
//             // 将数据存入 Redis
//             redisTemplate.opsForValue().set("macData:" + productSequence, payload);
//
//             // 立即同步到数据库
//             macDataMapper.insert(macData);
//         }catch (Exception e) {
//             e.printStackTrace();
//         }
//     }
//
//     private void logBreakStatusChange(String productSequence) {
//         // 记录 productSequence 值，可以保存到数据库或日志
//         System.out.println("BreakStatus changed from 1 to 2, productSequence: " + productSequence);
//         // 你可以在这里实现更复杂的记录逻辑，例如插入到数据库或发送通知
//     }
//
// }
//
